home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / language / xlisp_21.zoo / xl-xs001.bug < prev    next >
Internet Message Format  |  1990-02-28  |  3KB

  1. From sce!mitel!uunet!mcvax!kth!draken!liuida!mikpe Fri Apr 14 14:35:35 EDT 1989
  2. Article: 85 of comp.lang.lisp.x
  3. Path: cognos!sce!mitel!uunet!mcvax!kth!draken!liuida!mikpe
  4. From: mikpe@senilix.ida.liu.se (Mikael Pettersson)
  5. Newsgroups: comp.lang.lisp.x
  6. Subject: X{scheme,lisp} bugs
  7. Summary: operating on closed files can cause NULL dereferences
  8. Message-ID: <1244@senilix.ida.liu.se>
  9. Date: 13 Apr 89 04:13:07 GMT
  10. Organization: CIS Dept, Univ of Linkoping, Sweden
  11. Lines: 61
  12.  
  13.  
  14. I stumbled across a bug in Xscheme's handling of ports. It turns out
  15. that none of the functions that take ports as arguments check whether
  16. the port is open (i.e. it hasn't been closed) (except xclose() itself!).
  17. Sending a closed port to e.g. READ causes a NULL dereference down in
  18. the OS specific stuff: on my UNIX machine Xscheme dies with a SIGSEGV.
  19. The easiest fix (although it has the side-effect of making PORT? return #F
  20. for closed ports) is to change the portp() macro in xscheme.h like this:
  21.  
  22. *** xscheme.h.~1~    Sun Feb 19 13:25:29 1989
  23. --- xscheme.h    Wed Apr 12 18:41:26 1989
  24. ***************
  25. *** 207,213 ****
  26.   #define consp(x)    ((x) && ntype(x) == CONS)
  27.   #define stringp(x)    ((x) && ntype(x) == STRING)
  28.   #define symbolp(x)    ((x) && ntype(x) == SYMBOL)
  29. ! #define portp(x)    ((x) && ntype(x) == PORT)
  30.   #define objectp(x)    ((x) && ntype(x) == OBJECT)
  31.   #define fixp(x)        ((x) && ntype(x) == FIXNUM)
  32.   #define floatp(x)    ((x) && ntype(x) == FLONUM)
  33. --- 207,213 ----
  34.   #define consp(x)    ((x) && ntype(x) == CONS)
  35.   #define stringp(x)    ((x) && ntype(x) == STRING)
  36.   #define symbolp(x)    ((x) && ntype(x) == SYMBOL)
  37. ! #define portp(x)    ((x) && ntype(x) == PORT && getfile(x))
  38.   #define objectp(x)    ((x) && ntype(x) == OBJECT)
  39.   #define fixp(x)        ((x) && ntype(x) == FIXNUM)
  40.   #define floatp(x)    ((x) && ntype(x) == FLONUM)
  41.  
  42.  
  43. I then went to see if Xlisp was equally fragile, but luckily it wasn't.
  44. Only xformat() (due to it's checking for NIL, T and unnamed streams)
  45. misses to check that the file is open.
  46. The following patch fixes that problem (your line numbers may vary):
  47.  
  48. *** xlfio.c.~1~    Mon Dec 19 06:07:30 1988
  49. --- xlfio.c    Wed Apr 12 20:35:40 1989
  50. ***************
  51. *** 410,416 ****
  52.       else {
  53.       if (stream == true)
  54.           stream = getvalue(s_stdout);
  55. !     else if (!streamp(stream) && !ustreamp(stream))
  56.           xlbadtype(stream);
  57.       val = NIL;
  58.       }
  59. --- 410,420 ----
  60.       else {
  61.       if (stream == true)
  62.           stream = getvalue(s_stdout);
  63. !     else if (streamp(stream)) {    /* copied from xlgetfile() */
  64. !         if (getfile(stream) == NULL)
  65. !         xlfail("file not open");
  66. !     }
  67. !     else if (!ustreamp(stream))
  68.           xlbadtype(stream);
  69.       val = NIL;
  70.       }
  71. -- 
  72. Mikael Pettersson, Dept of Comp & Info Sci, University of Linkoping, Sweden
  73. email: mpe@ida.liu.se  or  ..!{mcvax,munnari,uunet}!enea!liuida!mpe
  74.  
  75.  
  76.